package xyz.tanxiao.query;

import com.baomidou.mybatisplus.annotation.DbType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.util.*;

/**
 * 日期时间格式映射
 *
 * @author 万成波
 * @email 2300064869@qq.com
 * @createTime 2024-09-11 15:22:46 星期三
 */
public class FormatMappingHelper {

	private static final Map<DbType, FormatType> DB_FORMAT_MAP = new HashMap<>(2);


	static {
		// 格式映射
		List<Mapping> mappings = new ArrayList<>();
		mappings.add(new Mapping("yyyy", "%Y"));
		mappings.add(new Mapping("yyyy-MM", "%Y-%m"));
		mappings.add(new Mapping("yyyy-MM-dd", "%Y-%m-%d"));
		mappings.add(new Mapping("HH", "%H"));
		mappings.add(new Mapping("HH:mm", "%H:%i"));
		mappings.add(new Mapping("HH:mm:ss", "%H:%i:%s"));
		mappings.add(new Mapping("yyyy-MM-dd HH:mm:ss", "%Y-%m-%d %H:%i:%s"));

		// 数据库格式
		FormatType mysql = new FormatType();
		mysql.setName(DbType.MYSQL.name());
		mysql.setFormatMethod("DATE_FORMAT(%s, '%s')");
		mysql.getMappings().addAll(mappings);
		DB_FORMAT_MAP.put(DbType.MYSQL, mysql);
	}


	@Getter
	@Setter
	@AllArgsConstructor
	public static class Mapping {

		/**
		 * Java日期时间格式
		 */
		private String javaFormat;


		/**
		 * 数据库日期时间格式
		 */
		private String dbFormat;

	}


	@Getter
	@Setter
	public static class FormatType {

		/**
		 * 数据库名称 (小写)
		 */
		private String name;

		/**
		 * 格式化函数
		 */
		private String formatMethod;

		/**
		 * 日期时间格式映射
		 */
		private List<Mapping> mappings = new ArrayList<>(0);


		/**
		 * 通过Java日期时间格式获取日期格式映射
		 *
		 * @param format Java日期格式
		 * @return 日期格式映射
		 */
		public Mapping getMapping(String format) {
			return this.mappings.stream()
				.filter(m -> m.getJavaFormat().equals(format))
				.findFirst().orElse(null);
		}


		/**
		 * 通过Java日期时间格式获取数据库日期格式
		 *
		 * @param format Java日期格式
		 * @return 数据库日期格式
		 */
		public String getDbFormat(String format) {
			Mapping mapping = this.getMapping(format);
			if (Objects.nonNull(mapping)) {
				return mapping.getDbFormat();
			}
			return null;
		}

	}


	/**
	 * 获取数据库格式类型
	 *
	 * @param dbType 数据库类型
	 * @return 数据库格式类型
	 */
	public static FormatType getFormatType(DbType dbType) {
		return DB_FORMAT_MAP.get(dbType);
	}

}
